/**
 * 首先 根据有效列来确定要显示哪些列
 * 然后 根据这些列来生成一棵树
 * 最后 根据这棵树来生成一个表格
 */
function dynamicTable(tableId,dataObj,configObj){
	this.tableId = tableId ;
	this.dataObj = dataObj ;
	this.configObj = configObj ;
	this.records = null ;
	this.rootTree = null ;
}

/**
 * 根据配置对象来生成一棵树
 */
dynamicTable.prototype.generateTree = function(){
	var rootTree = new olapTree() ;
	for(var i = 0 ;i < this.dataObj.length ; i++){//遍历每一条数据，生成树结构
		rootTree.addNode(this.generateColumnDto(i) , this.generateValueDto(i)) ;
	}
	this.rootTree = rootTree ;
};
/**
 * 生成维度列表
 */
dynamicTable.prototype.generateColumnDto = function(i){
	var colNameArray = this.configObj.colNameArray ;
	var keyArray = new Array() ;
	for(var j = 0 ; j < colNameArray.length ; j++){
		keyArray.push(this.dataObj[i][colNameArray[j]]) ;
	}
	return keyArray ;
};

/**
 * 生成取值列表
 */
dynamicTable.prototype.generateValueDto = function(i){
	var valueObject = new valueObj() ;
	var valueNameArray = this.configObj.valueNameArray ;
	for(var j = 0 ;j < valueNameArray.length ; j ++){
		var valueName = valueNameArray[j] ;
		valueObject[valueName] = this.dataObj[i][valueName] ;
	}
	return valueObject ;
};

/**
 * 开始根据树渲染TABLE
 */
dynamicTable.prototype.renderTable = function(){
	this.generateTree();
	this.records = new Array() ;//记录数组,每一条记录都是一个Array
	this.parseTree(new Array()) ;
	return this.records ;
};
/**
 * 获得指定的节点
 */
dynamicTable.prototype.getTreeNode = function(keyArray){
	var tmp = this.rootTree ;
	for(var i = 0 ; i < keyArray.length ; i ++){
		tmp = tmp[keyArray[i]] ; 
	}
	return tmp ;
};

dynamicTable.prototype.parseTree = function(keyArray){
	var obj = this.getTreeNode(keyArray) ;
	if(obj["value"]){//如果已经到了叶子节点
		this.addRecord(obj["value"],keyArray) ;
		return ;
	}
	//遍历子节点
	for(var tmpName in obj){
		keyArray.push(tmpName);
		this.parseTree(keyArray) ;
		keyArray.pop() ;
	}
};

/**
 * 给结果集添加一条记录
 */
dynamicTable.prototype.addRecord = function(valueObj , keyArray){
	//生成数据的实现
	var tmp = new Array() ;
	for(var i = 0 ; i < keyArray.length ; i ++){
		tmp.push(keyArray[i]) ;
	}
	var valueNameArray = this.configObj.valueNameArray ;
	for(var i = 0 ;i < valueNameArray.length ; i ++){
		tmp.push(valueObj[valueNameArray[i]]) ;
	}
	this.records.push(tmp) ;
};

/**
 * 封装了树的操作
 */
function olapTree(){
}
//root[山东][都邦][value] = 123 ;
olapTree.prototype.addNode = function(keyArray , valueObj){
	var tmp = this ;
	for(var i = 0 ; i < keyArray.length ; i++){
		if(!tmp[keyArray[i]])
			tmp[keyArray[i]] = new Object() ;
		tmp = tmp[keyArray[i]] ;
	}
	if(!tmp["value"])
		tmp["value"] = valueObj ;
	else
		tmp["value"].add(valueObj) ;
};	

/**
 * 封装值
 */
function valueObj(){
}
valueObj.prototype.add = function(obj){
	for(var tmpName in this){
		if(typeof this[tmpName]!="function")
			this[tmpName] = this[tmpName]*1 + obj[tmpName]*1 ;
	}
};